﻿// <kernel for logging mobile worker.>
//     Copyright (C) 2013  APKO
// 
//     This program is free software: you can redistribute it and/or modify
//     it under the terms of the GNU General Public License as published by
//     the Free Software Foundation, either version 3 of the License, or
//     (at your option) any later version.
// 
//     This program is distributed in the hope that it will be useful,
//     but WITHOUT ANY WARRANTY; without even the implied warranty of
//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//     GNU General Public License for more details.
// 
//     You should have received a copy of the GNU General Public License
//     along with this program.  If not, see <http://www.gnu.org/licenses/>.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Data;

namespace kernel.gui.controllers {
    internal class NumericToValueTypeConverter : IValueConverter {
        public object Convert(object value,
                              Type targetType,
                              object parameter,
                              CultureInfo culture) {
            if (null == value) {
                return ValueTypes.NoNumeric;
            }
            var numericTypes = new HashSet<Type> {
                typeof (Byte),
                typeof (Decimal),
                typeof (Double),
                typeof (Int16),
                typeof (Int32),
                typeof (Int64),
                typeof (SByte),
                typeof (Single),
                typeof (UInt16),
                typeof (UInt32),
                typeof (UInt64)
            };
            if (numericTypes.Contains(value.GetType())) {
                var intTypes = new HashSet<Type> {
                    typeof (Byte),
                    typeof (Int16),
                    typeof (Int32),
                    typeof (Int64),
                    typeof (SByte),
                    typeof (UInt16),
                    typeof (UInt32),
                    typeof (UInt64)
                };
                return intTypes.Contains(value.GetType()) ? ValueTypes.Integer : ValueTypes.Double;
            }
            return ValueTypes.NoNumeric;
        }

        public object ConvertBack(object value, Type targetType,
                                  object parameter,
                                  CultureInfo culture) {
            throw new NotSupportedException();
        }
    }

    public enum ValueTypes {
        NoNumeric,
        Integer,
        Double
    }
}